package cn.org.exam.common.util;

import cn.org.exam.model.entity.Role;
import cn.org.exam.model.entity.User;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import java.security.Key;
import java.util.*;
import java.util.stream.Collectors;

/**
 * JWT 工具类
 */
public class JwtUtil {

    // >= 32 字节的密钥（你可以保持原样）
    private static final String SECRET_KEY = "online-exam-system-secret-key-1234567890";
    private static final Key KEY = Keys.hmacShaKeyFor(SECRET_KEY.getBytes());

    // token 有效时间：24 小时
    private static final long EXPIRE_TIME = 1000L * 60 * 60 * 24;

    /**
     * 生成 token，存储用户 ID + 角色列表
     */
    public static String generateToken(User user) {

        Map<String, Object> claims = new HashMap<>();
        claims.put("uid", user.getId());

        // 多角色：用 code 列表
        List<String> roleCodes = (user.getRoles() == null)
                ? Collections.emptyList()
                : user.getRoles().stream()
                .map(Role::getCode)
                .collect(Collectors.toList());

        claims.put("roles", roleCodes);

        return Jwts.builder()
                .setClaims(claims)
                .setSubject(user.getUsername())
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRE_TIME))
                .signWith(KEY, SignatureAlgorithm.HS256)
                .compact();
    }

    /**
     * 解析 token
     */
    public static Claims parseToken(String token) throws JwtException {
        return Jwts.parserBuilder()
                .setSigningKey(KEY)
                .build()
                .parseClaimsJws(token)
                .getBody();
    }
}
